Repository navigation
Conversation
- Left / right on the game list jump to the previous / next console. - The console in the header opens a console picker (tap it, or X): all consoles, or only one console's games. The console is outlined while the list is filtered, and left / right then move the filter. Launching a game the filter hides lifts it. - USB link (protocol 3): CONSOLE_FILTER (emulink filter <console|all>), the filter in STATUS, and SCREENSHOT of the launcher's screen when no game runs (lv_snapshot, now enabled). - Graphics: a filtered roller does not wrap (a short list showed twice), and the Game Gear badge is lighter (it vanished on the dark header). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SFCMzomCZ5wRHJN4sxwkvY
|
✅Static analysis result - no issues found! ✅ |
Contributor
There was a problem hiding this comment.
🟡 Changes recommended
Programmatic launches can leave keypad input controlling games behind the visible console picker, and filtered game lists still wrap upward but not downward.
2 open issues
What changed in this PR
Extends the grouped launcher introduced in #133 with console filtering and quick navigation, plus USB controls for filtering and launcher screenshots.
Changes:
- Adds a console picker, Left/Right console navigation, and filter indicators.
- Updates USB protocol 3 and
emulinkto support console filters and launcher screenshots. - Uses non-wrapping filtered lists and brightens the Game Gear badge.
| File | Description |
|---|---|
tools/emulink/emulink/control.py |
Adds the console-filter API and documents launcher captures. |
tools/emulink/emulink/cli.py |
Adds the filter command and updates screenshot help. |
sdkconfig.defaults |
Enables LVGL snapshots for launcher captures. |
README.md |
Documents console navigation and filtering. |
main/remote_control.hpp |
Adds protocol 3 filtering, filter status, and launcher captures. |
components/rom_info/src/rom_info.cpp |
Lightens the Game Gear badge color. |
components/gui/src/gui.cpp |
Implements filtering, picker controls, console navigation, and snapshots. |
components/gui/include/gui.hpp |
Declares filter and snapshot APIs, picker state, and X-button handling. |
Review effort: Balanced
| lv_roller_set_options(ui_roms, options.c_str(), LV_ROLLER_MODE_INFINITE); | ||
| // (one console's games can be too few to fill an infinite roller, which | ||
| // then shows them twice) | ||
| lv_roller_set_options(ui_roms, options.c_str(), filter_ >= 0 ? LV_ROLLER_MODE_NORMAL : LV_ROLLER_MODE_INFINITE); |
| roller_row_ = row; | ||
| lv_roller_set_selected(ui_roms, row, LV_ANIM_OFF); | ||
| on_rom_focused(i); | ||
| return true; |
ESP-IDF Size Report for 'Esp Box Emu'
FLASH uses app .bin size or json2 flash sum. RAM sums DRAM+IRAM via idf_size. Percentages shown when totals are available. |
esp_tinyusb 3.0.1 (TinyUSB 0.21.0~6, the DWC2 SETUP-DMA erratum workaround) corrupts the PSRAM heap on esp-box-emu while a Genesis game runs: the link task's next allocation hits a tlsf assert or an MMU entry fault. With 3.0.0 the same firmware is fine (checked on the box with the same commit built both ways). A fresh build resolves '>=3.0.0' to 3.0.1, so CI would have shipped it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SFCMzomCZ5wRHJN4sxwkvY
The heap corruption seen with Sonic 2 on the box turned out to be intermittent: the same builds that failed also pass repeated trials, so the runs that blamed esp_tinyusb 3.0.1 were not evidence of a cause. The corruption is tracked separately; no pin until it is understood. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SFCMzomCZ5wRHJN4sxwkvY
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Follow-up to #133: the console banner in the launcher's header is now interactive.
emulink launch) shows all consoles again. The filter stays across games but not across a reboot.CONSOLE_FILTER(emulink filter <console|all>), with the current filter instatus;emulink screenshotwith no game running now returns the launcher's screen, drawn withlv_snapshotinto a copy.CONFIG_LV_USE_SNAPSHOTis now enabled.Graphics: I checked the launcher with every console filtered (screenshots below) and fixed what I found:
No console has SD card art (
boxart/consoles/<key>.jpg) on this card, so these are all the firmware's badges.Tested on the box: picker by X / Down / A, Left / Right stepping, filters for all 9 consoles, a launch that lifts the filter, and the filter kept across a game.
Screenshots (
emulink screenshotof the launcher)The last one was taken with all consoles showing: Right jumped from a Game Boy game to the first Game Boy Color game.
Each console filtered (
emulink filter <key>; the badges are the firmware's own, since no console art is on the card):🤖 Generated with Claude Code
https://claude.ai/code/session_01SFCMzomCZ5wRHJN4sxwkvY